 /***********************************************************************************
  * file   : protocol.h
  * brief  : packaging & unpacking protocol packet
  * author : zx
  * Data   : 2020/4/28-21:58
  * Ver    :
  *             -Ver.1.0 first add 
  * Note   : Developers don't need to care about implementation details, just learn how to use these two function "packProtocol()" & "packProtocol()"
  * BBS    : http://www.openelec.cn/
  * 
  * Copyright (C) 2020-2021 zx. All rights reserved.
  ***********************************************************************************/ 
#ifndef __PROTOCOL__H
#define __PROTOCOL__H

/* config */
// #define BIGENDIAN               //big endian
#define LITTLEENDIAN            //little endian

#define MSGSIZE                 30         //receive msg size
#define TBUFFERSIZE             30         //send buffer size

/* the history version of protocol*/
#define VERSION_1_0             0x10        //20200408

/* protocol */
#define HEAD                    0x5A58      //protocol head
#define VERSION                 VERSION_1_0 //protocol version        
#define ORGANIZATION            0x0000      //protocol organization [reserve]
#define SECTION                 0x0000      //protocol section      [reserve]
#define DATAPOINT               0x0000      //protocol datapoint    [reserve]

#define HEAD_SIZE               2
#define VERSION_SIZE            1
#define ORGANIZATION_SIZE       2
#define SECTION_SIZE            2
#define DATAPOINT_SIZE          2
#define COMPONENTTYPE_SIZE      2
#define COMPONENTNUMBER_SIZE    2
#define COMPONENTMSGTYPE_SIZE   1
#define COMPONENTMSGLEN_SIZE    2
#define CRC_SIZE                1

#if VERSION == VERSION_1_0

#define PROTOCOL_SIZE           (HEAD_SIZE + VERSION_SIZE + ORGANIZATION_SIZE + SECTION_SIZE + DATAPOINT_SIZE + COMPONENTTYPE_SIZE + COMPONENTNUMBER_SIZE + COMPONENTMSGLEN_SIZE + CRC_SIZE)

#endif
/* component type */
typedef enum
{
    NONE_COMPONENT =    -1,

    /*define ctrol component*/
    PUSHBUTTON     =    1,      //push button
    SWITCHBUTTON   =    2,      //switch
    SLIDER         =    3,      //slider
    DIAL           =    4,      //dial

    /*define show component*/
    WATERLEVER     =    1001,   //water level
    BATTERY        =    1002,   //battery power
    CARDASHBOARD   =    1003,   //car dashboard
    CLOCK          =    1004,   //clock with hour, minute, second hands
    COMPASS        =    1005,   //compass
    LEDDOT         =    1006,   //LED dot matrix
    LCDNUMBER      =    1007,   //lcd number
    LEDSTATE       =    1008,   //LED state
    PLANEDASHBOARD =    1009,   //plane dashboard
    TEMPMETER      =    1010,   //temperature meter
    LABEL          =    1011,   //text label
    LCDDATETIME    =    1012,   //datetime lcdnumber

    /*define chart component*/
    WAVECHART      =    2001,   //wave chart

    /*KEY & MOUSE*/
    KEYBOARD       =    9001,
    MOUSE          =    9002
}COMPONENT_TYPE;

/* mmessage type */
typedef enum
{
    NONE_MSG                 = -1,

    PUSHBUTTON_PRESS         = 0,
    PUSHBUTTON_RELEASE       = 1,

    SWITCH_OFF               = 2,
    SWITCH_ON                = 3,

    SLIDER_VALUE             = 4,

    DIAL_VALUE               = 5,

    CLOCK_PERIOD             = 6,
    CLOCK_ALARM              = 7,

    DATETIME_PERIOD          = 8,
    DATETIME_ALARM           = 9,

    KEY_PRESS                = 10,

    MOUSE_PRESS              = 11,
    MOUSE_WHEEL              = 12
}MSG_TYPE;

/* mousebutton value */
typedef enum
{
    NoButton         = 0x00000000,
    LeftButton       = 0x00000001,
    RightButton      = 0x00000002,
    MidButton        = 0x00000004, 
    MiddleButton     = MidButton,
    BackButton       = 0x00000008,
    XButton1         = BackButton,
    ExtraButton1     = XButton1,
    ForwardButton    = 0x00000010,
    XButton2         = ForwardButton,
    ExtraButton2     = ForwardButton,
    TaskButton       = 0x00000020,
    ExtraButton3     = TaskButton,
    ExtraButton4     = 0x00000040,
    ExtraButton5     = 0x00000080,
    ExtraButton6     = 0x00000100,
    ExtraButton7     = 0x00000200,
    ExtraButton8     = 0x00000400,
    ExtraButton9     = 0x00000800,
    ExtraButton10    = 0x00001000,
    ExtraButton11    = 0x00002000,
    ExtraButton12    = 0x00004000,
    ExtraButton13    = 0x00008000,
    ExtraButton14    = 0x00010000,
    ExtraButton15    = 0x00020000,
    ExtraButton16    = 0x00040000,
    ExtraButton17    = 0x00080000,
    ExtraButton18    = 0x00100000,
    ExtraButton19    = 0x00200000,
    ExtraButton20    = 0x00400000,
    ExtraButton21    = 0x00800000,
    ExtraButton22    = 0x01000000,
    ExtraButton23    = 0x02000000,
    ExtraButton24    = 0x04000000,
    AllButtons       = 0x07ffffff,
    MaxMouseButton   = ExtraButton24,
    // 4 high-order bits remain available for future use (0x08000000 through 0x40000000).
    MouseButtonMask  = 0xffffffff
}MOUSEBUTTON;

/* keyboard keys value */
typedef enum
{
    Key_Escape = 0x01000000,                // misc keys
    Key_Tab = 0x01000001,
    Key_Backtab = 0x01000002,
    Key_Backspace = 0x01000003,
    Key_Return = 0x01000004,
    Key_Enter = 0x01000005,
    Key_Insert = 0x01000006,
    Key_Delete = 0x01000007,
    Key_Pause = 0x01000008,
    Key_Print = 0x01000009,               // print screen
    Key_SysReq = 0x0100000a,
    Key_Clear = 0x0100000b,
    Key_Home = 0x01000010,                // cursor movement
    Key_End = 0x01000011,
    Key_Left = 0x01000012,
    Key_Up = 0x01000013,
    Key_Right = 0x01000014,
    Key_Down = 0x01000015,
    Key_PageUp = 0x01000016,
    Key_PageDown = 0x01000017,
    Key_Shift = 0x01000020,                // modifiers
    Key_Control = 0x01000021,
    Key_Meta = 0x01000022,
    Key_Alt = 0x01000023,
    Key_CapsLock = 0x01000024,
    Key_NumLock = 0x01000025,
    Key_ScrollLock = 0x01000026,
    Key_F1 = 0x01000030,                // function keys
    Key_F2 = 0x01000031,
    Key_F3 = 0x01000032,
    Key_F4 = 0x01000033,
    Key_F5 = 0x01000034,
    Key_F6 = 0x01000035,
    Key_F7 = 0x01000036,
    Key_F8 = 0x01000037,
    Key_F9 = 0x01000038,
    Key_F10 = 0x01000039,
    Key_F11 = 0x0100003a,
    Key_F12 = 0x0100003b,
    Key_F13 = 0x0100003c,
    Key_F14 = 0x0100003d,
    Key_F15 = 0x0100003e,
    Key_F16 = 0x0100003f,
    Key_F17 = 0x01000040,
    Key_F18 = 0x01000041,
    Key_F19 = 0x01000042,
    Key_F20 = 0x01000043,
    Key_F21 = 0x01000044,
    Key_F22 = 0x01000045,
    Key_F23 = 0x01000046,
    Key_F24 = 0x01000047,
    Key_F25 = 0x01000048,                // F25 .. F35 only on X11
    Key_F26 = 0x01000049,
    Key_F27 = 0x0100004a,
    Key_F28 = 0x0100004b,
    Key_F29 = 0x0100004c,
    Key_F30 = 0x0100004d,
    Key_F31 = 0x0100004e,
    Key_F32 = 0x0100004f,
    Key_F33 = 0x01000050,
    Key_F34 = 0x01000051,
    Key_F35 = 0x01000052,
    Key_Super_L = 0x01000053,                 // extra keys
    Key_Super_R = 0x01000054,
    Key_Menu = 0x01000055,
    Key_Hyper_L = 0x01000056,
    Key_Hyper_R = 0x01000057,
    Key_Help = 0x01000058,
    Key_Direction_L = 0x01000059,
    Key_Direction_R = 0x01000060,
    Key_Space = 0x20,                // 7 bit printable ASCII
    Key_Any = Key_Space,
    Key_Exclam = 0x21,
    Key_QuoteDbl = 0x22,
    Key_NumberSign = 0x23,
    Key_Dollar = 0x24,
    Key_Percent = 0x25,
    Key_Ampersand = 0x26,
    Key_Apostrophe = 0x27,
    Key_ParenLeft = 0x28,
    Key_ParenRight = 0x29,
    Key_Asterisk = 0x2a,
    Key_Plus = 0x2b,
    Key_Comma = 0x2c,
    Key_Minus = 0x2d,
    Key_Period = 0x2e,
    Key_Slash = 0x2f,
    Key_0 = 0x30,
    Key_1 = 0x31,
    Key_2 = 0x32,
    Key_3 = 0x33,
    Key_4 = 0x34,
    Key_5 = 0x35,
    Key_6 = 0x36,
    Key_7 = 0x37,
    Key_8 = 0x38,
    Key_9 = 0x39,
    Key_Colon = 0x3a,
    Key_Semicolon = 0x3b,
    Key_Less = 0x3c,
    Key_Equal = 0x3d,
    Key_Greater = 0x3e,
    Key_Question = 0x3f,
    Key_At = 0x40,
    Key_A = 0x41,
    Key_B = 0x42,
    Key_C = 0x43,
    Key_D = 0x44,
    Key_E = 0x45,
    Key_F = 0x46,
    Key_G = 0x47,
    Key_H = 0x48,
    Key_I = 0x49,
    Key_J = 0x4a,
    Key_K = 0x4b,
    Key_L = 0x4c,
    Key_M = 0x4d,
    Key_N = 0x4e,
    Key_O = 0x4f,
    Key_P = 0x50,
    Key_Q = 0x51,
    Key_R = 0x52,
    Key_S = 0x53,
    Key_T = 0x54,
    Key_U = 0x55,
    Key_V = 0x56,
    Key_W = 0x57,
    Key_X = 0x58,
    Key_Y = 0x59,
    Key_Z = 0x5a,
    Key_BracketLeft = 0x5b,
    Key_Backslash = 0x5c,
    Key_BracketRight = 0x5d,
    Key_AsciiCircum = 0x5e,
    Key_Underscore = 0x5f,
    Key_QuoteLeft = 0x60,
    Key_BraceLeft = 0x7b,
    Key_Bar = 0x7c,
    Key_BraceRight = 0x7d,
    Key_AsciiTilde = 0x7e,

    Key_nobreakspace = 0x0a0,
    Key_exclamdown = 0x0a1,
    Key_cent = 0x0a2,
    Key_sterling = 0x0a3,
    Key_currency = 0x0a4,
    Key_yen = 0x0a5,
    Key_brokenbar = 0x0a6,
    Key_section = 0x0a7,
    Key_diaeresis = 0x0a8,
    Key_copyright = 0x0a9,
    Key_ordfeminine = 0x0aa,
    Key_guillemotleft = 0x0ab,        // left angle quotation mark
    Key_notsign = 0x0ac,
    Key_hyphen = 0x0ad,
    Key_registered = 0x0ae,
    Key_macron = 0x0af,
    Key_degree = 0x0b0,
    Key_plusminus = 0x0b1,
    Key_twosuperior = 0x0b2,
    Key_threesuperior = 0x0b3,
    Key_acute = 0x0b4,
    Key_mu = 0x0b5,
    Key_paragraph = 0x0b6,
    Key_periodcentered = 0x0b7,
    Key_cedilla = 0x0b8,
    Key_onesuperior = 0x0b9,
    Key_masculine = 0x0ba,
    Key_guillemotright = 0x0bb,        // right angle quotation mark
    Key_onequarter = 0x0bc,
    Key_onehalf = 0x0bd,
    Key_threequarters = 0x0be,
    Key_questiondown = 0x0bf,
    Key_Agrave = 0x0c0,
    Key_Aacute = 0x0c1,
    Key_Acircumflex = 0x0c2,
    Key_Atilde = 0x0c3,
    Key_Adiaeresis = 0x0c4,
    Key_Aring = 0x0c5,
    Key_AE = 0x0c6,
    Key_Ccedilla = 0x0c7,
    Key_Egrave = 0x0c8,
    Key_Eacute = 0x0c9,
    Key_Ecircumflex = 0x0ca,
    Key_Ediaeresis = 0x0cb,
    Key_Igrave = 0x0cc,
    Key_Iacute = 0x0cd,
    Key_Icircumflex = 0x0ce,
    Key_Idiaeresis = 0x0cf,
    Key_ETH = 0x0d0,
    Key_Ntilde = 0x0d1,
    Key_Ograve = 0x0d2,
    Key_Oacute = 0x0d3,
    Key_Ocircumflex = 0x0d4,
    Key_Otilde = 0x0d5,
    Key_Odiaeresis = 0x0d6,
    Key_multiply = 0x0d7,
    Key_Ooblique = 0x0d8,
    Key_Ugrave = 0x0d9,
    Key_Uacute = 0x0da,
    Key_Ucircumflex = 0x0db,
    Key_Udiaeresis = 0x0dc,
    Key_Yacute = 0x0dd,
    Key_THORN = 0x0de,
    Key_ssharp = 0x0df,
    Key_division = 0x0f7,
    Key_ydiaeresis = 0x0ff,

    // International input method support (X keycode - 0xEE00, the
    // definition follows Qt/Embedded 2.3.7) Only interesting if
    // you are writing your own input method

    // International & multi-key character composition
    Key_AltGr               = 0x01001103,
    Key_Multi_key           = 0x01001120,  // Multi-key character compose
    Key_Codeinput           = 0x01001137,
    Key_SingleCandidate     = 0x0100113c,
    Key_MultipleCandidate   = 0x0100113d,
    Key_PreviousCandidate   = 0x0100113e,

    // Misc Functions
    Key_Mode_switch         = 0x0100117e,  // Character set switch
    //Key_script_switch       = 0x0100117e,  // Alias for mode_switch

    // Japanese keyboard support
    Key_Kanji               = 0x01001121,  // Kanji, Kanji convert
    Key_Muhenkan            = 0x01001122,  // Cancel Conversion
    //Key_Henkan_Mode         = 0x01001123,  // Start/Stop Conversion
    Key_Henkan              = 0x01001123,  // Alias for Henkan_Mode
    Key_Romaji              = 0x01001124,  // to Romaji
    Key_Hiragana            = 0x01001125,  // to Hiragana
    Key_Katakana            = 0x01001126,  // to Katakana
    Key_Hiragana_Katakana   = 0x01001127,  // Hiragana/Katakana toggle
    Key_Zenkaku             = 0x01001128,  // to Zenkaku
    Key_Hankaku             = 0x01001129,  // to Hankaku
    Key_Zenkaku_Hankaku     = 0x0100112a,  // Zenkaku/Hankaku toggle
    Key_Touroku             = 0x0100112b,  // Add to Dictionary
    Key_Massyo              = 0x0100112c,  // Delete from Dictionary
    Key_Kana_Lock           = 0x0100112d,  // Kana Lock
    Key_Kana_Shift          = 0x0100112e,  // Kana Shift
    Key_Eisu_Shift          = 0x0100112f,  // Alphanumeric Shift
    Key_Eisu_toggle         = 0x01001130,  // Alphanumeric toggle
    //Key_Kanji_Bangou        = 0x01001137,  // Codeinput
    //Key_Zen_Koho            = 0x0100113d,  // Multiple/All Candidate(s)
    //Key_Mae_Koho            = 0x0100113e,  // Previous Candidate

    // Korean keyboard support
    //
    // In fact, many Korean users need only 2 keys, Key_Hangul and
    // Key_Hangul_Hanja. But rest of the keys are good for future.

    Key_Hangul              = 0x01001131,  // Hangul start/stop(toggle)
    Key_Hangul_Start        = 0x01001132,  // Hangul start
    Key_Hangul_End          = 0x01001133,  // Hangul end, English start
    Key_Hangul_Hanja        = 0x01001134,  // Start Hangul->Hanja Conversion
    Key_Hangul_Jamo         = 0x01001135,  // Hangul Jamo mode
    Key_Hangul_Romaja       = 0x01001136,  // Hangul Romaja mode
    //Key_Hangul_Codeinput    = 0x01001137,  // Hangul code input mode
    Key_Hangul_Jeonja       = 0x01001138,  // Jeonja mode
    Key_Hangul_Banja        = 0x01001139,  // Banja mode
    Key_Hangul_PreHanja     = 0x0100113a,  // Pre Hanja conversion
    Key_Hangul_PostHanja    = 0x0100113b,  // Post Hanja conversion
    //Key_Hangul_SingleCandidate   = 0x0100113c,  // Single candidate
    //Key_Hangul_MultipleCandidate = 0x0100113d,  // Multiple candidate
    //Key_Hangul_PreviousCandidate = 0x0100113e,  // Previous candidate
    Key_Hangul_Special      = 0x0100113f,  // Special symbols
    //Key_Hangul_switch       = 0x0100117e,  // Alias for mode_switch

    // dead keys (X keycode - 0xED00 to avoid the conflict)
    Key_Dead_Grave          = 0x01001250,
    Key_Dead_Acute          = 0x01001251,
    Key_Dead_Circumflex     = 0x01001252,
    Key_Dead_Tilde          = 0x01001253,
    Key_Dead_Macron         = 0x01001254,
    Key_Dead_Breve          = 0x01001255,
    Key_Dead_Abovedot       = 0x01001256,
    Key_Dead_Diaeresis      = 0x01001257,
    Key_Dead_Abovering      = 0x01001258,
    Key_Dead_Doubleacute    = 0x01001259,
    Key_Dead_Caron          = 0x0100125a,
    Key_Dead_Cedilla        = 0x0100125b,
    Key_Dead_Ogonek         = 0x0100125c,
    Key_Dead_Iota           = 0x0100125d,
    Key_Dead_Voiced_Sound   = 0x0100125e,
    Key_Dead_Semivoiced_Sound = 0x0100125f,
    Key_Dead_Belowdot       = 0x01001260,
    Key_Dead_Hook           = 0x01001261,
    Key_Dead_Horn           = 0x01001262,

    // multimedia/internet keys - ignored by default - see QKeyEvent c'tor
    Key_Back  = 0x01000061,
    Key_Forward  = 0x01000062,
    Key_Stop  = 0x01000063,
    Key_Refresh  = 0x01000064,
    Key_VolumeDown = 0x01000070,
    Key_VolumeMute  = 0x01000071,
    Key_VolumeUp = 0x01000072,
    Key_BassBoost = 0x01000073,
    Key_BassUp = 0x01000074,
    Key_BassDown = 0x01000075,
    Key_TrebleUp = 0x01000076,
    Key_TrebleDown = 0x01000077,
    Key_MediaPlay  = 0x01000080,
    Key_MediaStop  = 0x01000081,
    Key_MediaPrevious  = 0x01000082,
    Key_MediaNext  = 0x01000083,
    Key_MediaRecord = 0x01000084,
    Key_MediaPause = 0x1000085,
    Key_MediaTogglePlayPause = 0x1000086,
    Key_HomePage  = 0x01000090,
    Key_Favorites  = 0x01000091,
    Key_Search  = 0x01000092,
    Key_Standby = 0x01000093,
    Key_OpenUrl = 0x01000094,
    Key_LaunchMail  = 0x010000a0,
    Key_LaunchMedia = 0x010000a1,
    Key_Launch0  = 0x010000a2,
    Key_Launch1  = 0x010000a3,
    Key_Launch2  = 0x010000a4,
    Key_Launch3  = 0x010000a5,
    Key_Launch4  = 0x010000a6,
    Key_Launch5  = 0x010000a7,
    Key_Launch6  = 0x010000a8,
    Key_Launch7  = 0x010000a9,
    Key_Launch8  = 0x010000aa,
    Key_Launch9  = 0x010000ab,
    Key_LaunchA  = 0x010000ac,
    Key_LaunchB  = 0x010000ad,
    Key_LaunchC  = 0x010000ae,
    Key_LaunchD  = 0x010000af,
    Key_LaunchE  = 0x010000b0,
    Key_LaunchF  = 0x010000b1,
    Key_MonBrightnessUp = 0x010000b2,
    Key_MonBrightnessDown = 0x010000b3,
    Key_KeyboardLightOnOff = 0x010000b4,
    Key_KeyboardBrightnessUp = 0x010000b5,
    Key_KeyboardBrightnessDown = 0x010000b6,
    Key_PowerOff = 0x010000b7,
    Key_WakeUp = 0x010000b8,
    Key_Eject = 0x010000b9,
    Key_ScreenSaver = 0x010000ba,
    Key_WWW = 0x010000bb,
    Key_Memo = 0x010000bc,
    Key_LightBulb = 0x010000bd,
    Key_Shop = 0x010000be,
    Key_History = 0x010000bf,
    Key_AddFavorite = 0x010000c0,
    Key_HotLinks = 0x010000c1,
    Key_BrightnessAdjust = 0x010000c2,
    Key_Finance = 0x010000c3,
    Key_Community = 0x010000c4,
    Key_AudioRewind = 0x010000c5, // Media rewind
    Key_BackForward = 0x010000c6,
    Key_ApplicationLeft = 0x010000c7,
    Key_ApplicationRight = 0x010000c8,
    Key_Book = 0x010000c9,
    Key_CD = 0x010000ca,
    Key_Calculator = 0x010000cb,
    Key_ToDoList = 0x010000cc,
    Key_ClearGrab = 0x010000cd,
    Key_Close = 0x010000ce,
    Key_Copy = 0x010000cf,
    Key_Cut = 0x010000d0,
    Key_Display = 0x010000d1, // Output switch key
    Key_DOS = 0x010000d2,
    Key_Documents = 0x010000d3,
    Key_Excel = 0x010000d4,
    Key_Explorer = 0x010000d5,
    Key_Game = 0x010000d6,
    Key_Go = 0x010000d7,
    Key_iTouch = 0x010000d8,
    Key_LogOff = 0x010000d9,
    Key_Market = 0x010000da,
    Key_Meeting = 0x010000db,
    Key_MenuKB = 0x010000dc,
    Key_MenuPB = 0x010000dd,
    Key_MySites = 0x010000de,
    Key_News = 0x010000df,
    Key_OfficeHome = 0x010000e0,
    Key_Option = 0x010000e1,
    Key_Paste = 0x010000e2,
    Key_Phone = 0x010000e3,
    Key_Calendar = 0x010000e4,
    Key_Reply = 0x010000e5,
    Key_Reload = 0x010000e6,
    Key_RotateWindows = 0x010000e7,
    Key_RotationPB = 0x010000e8,
    Key_RotationKB = 0x010000e9,
    Key_Save = 0x010000ea,
    Key_Send = 0x010000eb,
    Key_Spell = 0x010000ec,
    Key_SplitScreen = 0x010000ed,
    Key_Support = 0x010000ee,
    Key_TaskPane = 0x010000ef,
    Key_Terminal = 0x010000f0,
    Key_Tools = 0x010000f1,
    Key_Travel = 0x010000f2,
    Key_Video = 0x010000f3,
    Key_Word = 0x010000f4,
    Key_Xfer = 0x010000f5,
    Key_ZoomIn = 0x010000f6,
    Key_ZoomOut = 0x010000f7,
    Key_Away = 0x010000f8,
    Key_Messenger = 0x010000f9,
    Key_WebCam = 0x010000fa,
    Key_MailForward = 0x010000fb,
    Key_Pictures = 0x010000fc,
    Key_Music = 0x010000fd,
    Key_Battery = 0x010000fe,
    Key_Bluetooth = 0x010000ff,
    Key_WLAN = 0x01000100,
    Key_UWB = 0x01000101,
    Key_AudioForward = 0x01000102, // Media fast-forward
    Key_AudioRepeat = 0x01000103, // Toggle repeat mode
    Key_AudioRandomPlay = 0x01000104, // Toggle shuffle mode
    Key_Subtitle = 0x01000105,
    Key_AudioCycleTrack = 0x01000106,
    Key_Time = 0x01000107,
    Key_Hibernate = 0x01000108,
    Key_View = 0x01000109,
    Key_TopMenu = 0x0100010a,
    Key_PowerDown = 0x0100010b,
    Key_Suspend = 0x0100010c,
    Key_ContrastAdjust = 0x0100010d,

    Key_LaunchG  = 0x0100010e,
    Key_LaunchH  = 0x0100010f,

    Key_TouchpadToggle = 0x01000110,
    Key_TouchpadOn = 0x01000111,
    Key_TouchpadOff = 0x01000112,

    Key_MicMute = 0x01000113,

    Key_Red = 0x01000114,
    Key_Green = 0x01000115,
    Key_Yellow = 0x01000116,
    Key_Blue = 0x01000117,

    Key_ChannelUp = 0x01000118,
    Key_ChannelDown = 0x01000119,

    Key_Guide    = 0x0100011a,
    Key_Info     = 0x0100011b,
    Key_Settings = 0x0100011c,

    Key_MicVolumeUp   = 0x0100011d,
    Key_MicVolumeDown = 0x0100011e,

    Key_New      = 0x01000120,
    Key_Open     = 0x01000121,
    Key_Find     = 0x01000122,
    Key_Undo     = 0x01000123,
    Key_Redo     = 0x01000124,

    Key_MediaLast = 0x0100ffff,

    // Keypad navigation keys
    Key_Select = 0x01010000,
    Key_Yes = 0x01010001,
    Key_No = 0x01010002,

    // Newer misc keys
    Key_Cancel  = 0x01020001,
    Key_Printer = 0x01020002,
    Key_Execute = 0x01020003,
    Key_Sleep   = 0x01020004,
    Key_Play    = 0x01020005, // Not the same as Key_MediaPlay
    Key_Zoom    = 0x01020006,
    //Key_Jisho   = 0x01020007, // IME: Dictionary key
    //Key_Oyayubi_Left = 0x01020008, // IME: Left Oyayubi key
    //Key_Oyayubi_Right = 0x01020009, // IME: Right Oyayubi key
    Key_Exit    = 0x0102000a,

    // Device keys
    Key_Context1 = 0x01100000,
    Key_Context2 = 0x01100001,
    Key_Context3 = 0x01100002,
    Key_Context4 = 0x01100003,
    Key_Call = 0x01100004,      // set absolute state to in a call (do not toggle state)
    Key_Hangup = 0x01100005,    // set absolute state to hang up (do not toggle state)
    Key_Flip = 0x01100006,
    Key_ToggleCallHangup = 0x01100007, // a toggle key for answering, or hanging up, based on current call state
    Key_VoiceDial = 0x01100008,
    Key_LastNumberRedial = 0x01100009,

    Key_Camera = 0x01100020,
    Key_CameraFocus = 0x01100021,

    Key_unknown = 0x01ffffff
}KEY;

/* protocol struct */
typedef struct
{
    char  version;              

    unsigned short organization;     //reserve  
    unsigned short section;          //reserve         
    unsigned short datapoint;        //reserve  

    COMPONENT_TYPE componenttype;
    unsigned short componentnum;
    MSG_TYPE  msgtype;

    char tbuffer[TBUFFERSIZE];
}ProtocolObject;

void packProtocol(unsigned short organization, unsigned short section, unsigned short datapoint, COMPONENT_TYPE componenttype, unsigned short componentnum, MSG_TYPE msgtype, char * msg, unsigned short msglen, char * tbuffer, unsigned short * tbufferlen);
char unpackProtocol(ProtocolObject * protocol, char * data, unsigned short datalen, char * rbuffer,  unsigned short * rbufferlen);

#endif
